package com.tedu.api.io;

import org.junit.Test;

import java.io.*;

/**
 * 【高级流】对象流---传输对象---实现序列化接口Serializable：功能：将对象转换为二进制--使用率高
 *                            版本号：一定要写，对象写出，对象读入，必须统一版本号
 *
 * ObjectOutputStream 对象输出流  写出 ---Person.java
 *ObjectInputStream   对象输入流  读入---Person.java
 */
public class ObjectIO {
    //需求：将Person.java 文件 变成对象 写出--序列化
    @Test
    public void testOOS() throws IOException {
        //传输对象：创建对象
        Person p=new Person();
        p.setNames("韩美娟");
        //String[] say=new String[]{}
        //字符串数组：动态数组传输--给定元素决定数组长度
        p.setSay(new String[]{"百因必有果，你的报应就是我~"});

        //传输符合条件对象--输出流---Xxx.obj  文件是一种对象文件保存格式
        FileOutputStream fos=new FileOutputStream("person.obj");
        //高级流：ObjectOutputStream
        ObjectOutputStream oos=new ObjectOutputStream(fos);
        /**
         * writeObject(Object obj) ---写出对象
         * 作用：将给定对象按照其结构进行转换，转换为一组“组”字节
         *      在通过处理的流写出，写出格式：xxx.obj
         *
         * 抛出异常：NotSerializableException 没有实现序列化接口
         * 原因：传输对象上没有实现Serializable序列化接口
         *
         * Person 类---去掉实现序列化接口：Serializable
         *
         * 对象文件写出操作需要经过2个步骤：（专业术语）
         * 1.通过对象输出流将Person类，转换为一组“组”字节，这个过程对象序列化
         * 2.将序列化后的字节在通过字节流（低级流）写出到项目中（硬盘上）做长久的保存，这个过程：数据持久化
         */
        oos.writeObject(p);

    }

    /**
     * ObjectInputStream 对象输入流/反序列化
     * 反序列化--二进制转换为对象
     * ClassNotFoundException   没有这个类型异常
     *                      产生原因：读入对象不正确,永久保存数据，类型读入不对
     *                        person1.class  person.obj
     *                        person2.class
     */
    @Test
    public void testOIS() throws IOException, ClassNotFoundException {
//创建输入流---person.obj--读入
        FileInputStream fis=new FileInputStream("person.obj");
        //创建高级流---对象输入流
        ObjectInputStream ois=new ObjectInputStream(fis);
        //readObject() 返回读取的对象，反序列操作
        System.out.println(ois.readObject());
    }

}